//import com.alibaba.fastjson2.JSONObject;
//import com.leezai.mqtt.Parser.ByteStreamParser;
//import com.leezai.mqtt.dto.HexDto;
//import com.leezai.mqtt.utils.HexStringUtils;
//import org.junit.Test;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//
//public class test {
//
//    @Test
//    public void testByteStreamParser() {
//        ByteStreamParser parser = new ByteStreamParser();
//
//        // 模拟十六进制数据 "48656C6C6F0001000A00FF"
//        // 对应字符串"Hello" + 数值1 + 数值10 + 状态码FF
//        String hexData = "48656C6C6F0001000A00FF";
//
//        byte[] bytes = HexStringUtils.hexToBytes(hexData);
//        List<HexDto> rules = new ArrayList<>();
//
//        HexDto rule1 = new HexDto();
//        rule1.setName("message");
//        rule1.setStartPosition(0);
//        rule1.setLength(5);
//        rule1.setType("1"); // 字符串
//
//        HexDto rule2 = new HexDto();
//        rule2.setName("value");
//        rule2.setStartPosition(5);
//        rule2.setLength(2);
//        rule2.setType("2"); // 整数
//
//        HexDto rule3 = new HexDto();
//        rule3.setName("status");
//        rule3.setStartPosition(9);
//        rule3.setLength(2);
//        rule3.setType("4"); // 十六进制
//
//        rules.add(rule1);
//        rules.add(rule2);
//        rules.add(rule3);
//
//        Map<String, Object> result = parser.parseBytes(bytes, rules);
//        System.out.println(result);
//        // 输出类似: {message=Hello, value=1, status=FF}
//    }
//
//    @Test
//    public void testMultipleBytes() {
//        ByteStreamParser parser = new ByteStreamParser();
//
//        // 测试多字节解析
//        // 数据: 0x12 0x34 0x56 0x78
//        String hexData = "12345678";
//
//        byte[] bytes = HexStringUtils.hexToBytes(hexData);
//        List<HexDto> rules = new ArrayList<>();
//
//        // 第1个字段: 从第0字节开始，1字节长度
//        HexDto rule1 = new HexDto();
//        rule1.setName("field1");
//        rule1.setStartPosition(0);
//        rule1.setLength(1);
//        rule1.setType("2");
//        rules.add(rule1);
//
//        // 第2个字段: 从第1字节开始，2字节长度
//        HexDto rule2 = new HexDto();
//        rule2.setName("field2");
//        rule2.setStartPosition(1);
//        rule2.setLength(2);
//        rule2.setType("2");
//        rules.add(rule2);
//
//        // 第3个字段: 从第3字节开始，1字节长度
//        HexDto rule3 = new HexDto();
//        rule3.setName("field3");
//        rule3.setStartPosition(3);
//        rule3.setLength(1);
//        rule3.setType("4");
//        rules.add(rule3);
//
//        Map<String, Object> result = parser.parseBytes(bytes, rules);
//        System.out.println("多字节解析结果: " + result);
//        // 预期输出: {field1=18, field2=13398, field3=78}
//    }
//
//    @Test
//    public void testFloatAndStringParsing() {
//        ByteStreamParser parser = new ByteStreamParser();
//
//        // 构造测试数据:
//        // 字节0-4: "TEST" 字符串 (0x54 0x45 0x53 0x54 0x00)
//        // 字节5-6: 温度值 25.5°C 编码为整数255 (0x00 0xFF)
//        // 字节7-8: 湿度值 60.5% 编码为整数605 (0x02 0x5D)
//        // 字节9-12: 压力值 1013.25hPa 编码为整数101325 (0x00 0x01 0x8B 0x45)
//        // 字节13-14: 状态码 (0xAB 0xCD)
//        String hexData = "544553540000FF025D00018B45ABCD";
//
//        byte[] bytes = HexStringUtils.hexToBytes(hexData);
//        List<HexDto> rules = new ArrayList<>();
//
//        // 字符串字段: 设备名称
//        HexDto deviceName = new HexDto();
//        deviceName.setName("deviceName");
//        deviceName.setStartPosition(0);
//        deviceName.setLength(5);
//        deviceName.setType("1"); // 字符串
//        rules.add(deviceName);
//
//        // 整数字段: 温度值 (实际值 = 255 / 10 = 25.5°C)
//        HexDto temperature = new HexDto();
//        temperature.setName("temperature");
//        temperature.setStartPosition(5);
//        temperature.setLength(2);
//        temperature.setType("3"); // 小数
//        temperature.setScale(10.0f);
//        rules.add(temperature);
//
//        // 整数字段: 湿度值 (实际值 = 605 / 10 = 60.5%)
//        HexDto humidity = new HexDto();
//        humidity.setName("humidity");
//        humidity.setStartPosition(7);
//        humidity.setLength(2);
//        humidity.setType("3"); // 小数
//        humidity.setScale(10.0f);
//        rules.add(humidity);
//
//        // 大整数字段: 压力值 (实际值 = 101325 / 100 = 1013.25 hPa)
//        HexDto pressure = new HexDto();
//        pressure.setName("pressure");
//        pressure.setStartPosition(9);
//        pressure.setLength(4);
//        pressure.setType("3"); // 小数
//        pressure.setScale(100.0f);
//        rules.add(pressure);
//
//        // 十六进制字段: 状态码
//        HexDto statusCode = new HexDto();
//        statusCode.setName("statusCode");
//        statusCode.setStartPosition(13);
//        statusCode.setLength(2);
//        statusCode.setType("4"); // 十六进制
//        rules.add(statusCode);
//
//        Map<String, Object> result = parser.parseBytes(bytes, rules);
//        System.out.println("浮点数和字符串解析结果: " + result);
//        // 预期输出:
//        // {deviceName="TEST", temperature=25.5, humidity=60.5, pressure=1013.25, statusCode="ABCD"}
//    }
//
//    @Test
//    public void testComplexDataStructure() {
//        ByteStreamParser parser = new ByteStreamParser();
//
//        // 复杂数据结构测试
//        // 字节0-3: 设备ID "DEV1" (0x44 0x45 0x56 0x31)
//        // 字节4-5: 版本号 2.1 编码为21 (0x00 0x15)
//        // 字节6-7: 信号强度 -75dBm (0xFF 0xB5)
//        // 字节8-11: 电池电压 3.7V 编码为3700 (0x00 0x00 0x0E 0x74)
//        // 字节12-15: 运行时间 1000000秒 (0x00 0x0F 0x42 0x40)
//        String hexData = "444556310015FFB500000E74000F4240";
//
//        byte[] bytes = HexStringUtils.hexToBytes(hexData);
//        List<HexDto> rules = new ArrayList<>();
//
//        // 字符串字段: 设备ID
//        HexDto deviceId = new HexDto();
//        deviceId.setName("deviceId");
//        deviceId.setStartPosition(0);
//        deviceId.setLength(4);
//        deviceId.setType("1");
//        rules.add(deviceId);
//
//        // 小数字段: 版本号 (实际值 = 21 / 10 = 2.1)
//        HexDto version = new HexDto();
//        version.setName("version");
//        version.setStartPosition(4);
//        version.setLength(2);
//        version.setType("3");
//        version.setScale(10.0f);
//        rules.add(version);
//
//        // 有符号整数字段: 信号强度
//        HexDto signalStrength = new HexDto();
//        signalStrength.setName("signalStrength");
//        signalStrength.setStartPosition(6);
//        signalStrength.setLength(2);
//        signalStrength.setType("2");
//        rules.add(signalStrength);
//
//        // 小数字段: 电池电压 (实际值 = 3700 / 1000 = 3.7V)
//        HexDto batteryVoltage = new HexDto();
//        batteryVoltage.setName("batteryVoltage");
//        batteryVoltage.setStartPosition(8);
//        batteryVoltage.setLength(4);
//        batteryVoltage.setType("3");
//        batteryVoltage.setScale(1000.0f);
//        rules.add(batteryVoltage);
//
//        // 整数字段: 运行时间
//        HexDto uptime = new HexDto();
//        uptime.setName("uptime");
//        uptime.setStartPosition(12);
//        uptime.setLength(4);
//        uptime.setType("2");
//        rules.add(uptime);
//
//        Map<String, Object> result = parser.parseBytes(bytes, rules);
//        System.out.println("复杂数据结构解析结果: " + result);
//        // 预期输出:
//        // {deviceId="DEV1", version=2.1, signalStrength=-75, batteryVoltage=3.7, uptime=1000000}
//    }
//
//    @Test
//    public void testNegativeFloatParsing() {
//        ByteStreamParser parser = new ByteStreamParser();
//
//        // 负数浮点数测试
//        // 字节0-3: 设备ID "SENS" (0x53 0x45 0x4E 0x53)
//        // 字节4-5: 负温度值 -15.5°C 编码为整数-155 (0xFF 0x65)
//        // 字节6-7: 负压力偏差 -25.8hPa 编码为整数-258 (0xFE 0xFE)
//        // 字节8-9: 正温度值 25.0°C 编码为整数250 (0x00 0xFA)
//        // 字节10-11: 状态码 (0xAB 0xCD)
//        String hexData = "53454E53FF65FEFE00FAABCD";
//
//        byte[] bytes = HexStringUtils.hexToBytes(hexData);
//        List<HexDto> rules = new ArrayList<>();
//
//        // 字符串字段: 设备ID
//        HexDto deviceId = new HexDto();
//        deviceId.setName("deviceId");
//        deviceId.setStartPosition(0);
//        deviceId.setLength(4);
//        deviceId.setType("1"); // 字符串
//        rules.add(deviceId);
//
//        // 负小数字段: 温度值 (实际值 = -155 / 10 = -15.5°C)
//        HexDto temperature = new HexDto();
//        temperature.setName("temperature");
//        temperature.setStartPosition(4);
//        temperature.setLength(2);
//        temperature.setType("3"); // 小数
//        temperature.setScale(10.0f);
//        rules.add(temperature);
//
//        // 负小数字段: 压力偏差 (实际值 = -258 / 10 = -25.8hPa)
//        HexDto pressureDiff = new HexDto();
//        pressureDiff.setName("pressureDiff");
//        pressureDiff.setStartPosition(6);
//        pressureDiff.setLength(2);
//        pressureDiff.setType("3"); // 小数
//        pressureDiff.setScale(10.0f);
//        rules.add(pressureDiff);
//
//        // 正小数字段: 温度值 (实际值 = 250 / 10 = 25.0°C)
//        HexDto positiveTemp = new HexDto();
//        positiveTemp.setName("positiveTemp");
//        positiveTemp.setStartPosition(8);
//        positiveTemp.setLength(2);
//        positiveTemp.setType("3"); // 小数
//        positiveTemp.setScale(10.0f);
//        rules.add(positiveTemp);
//
//        // 十六进制字段: 状态码
//        HexDto statusCode = new HexDto();
//        statusCode.setName("statusCode");
//        statusCode.setStartPosition(10);
//        statusCode.setLength(2);
//        statusCode.setType("4"); // 十六进制
//        rules.add(statusCode);
//
//        Map<String, Object> result = parser.parseBytes(bytes, rules);
//        System.out.println("负数浮点数解析结果: " + result);
//        // 预期输出:
//        // {deviceId="SENS", temperature=-15.5, pressureDiff=-25.8, positiveTemp=25.0, statusCode="ABCD"}
//    }
//
//
//    @Test
//    public void testFloatDoubleParsing() {
//        ByteStreamParser parser = new ByteStreamParser();
//
//        // 测试浮点数解析
//        // 字节0-3: 32位浮点数 3.14159 (IEEE 754格式: 0x40490FD0)
//        // 字节4-11: 64位浮点数 -2.718281828 (IEEE 754格式: 0xC005BF0A8B14576A)
//        // 字节12-15: 32位浮点数 1000.0 (IEEE 754格式: 0x447A0000)
//        String hexData = "40490FD0C005BF0A8B14576A447A0000";
//
//        byte[] bytes = HexStringUtils.hexToBytes(hexData);
//        List<HexDto> rules = new ArrayList<>();
//
//        // 32位浮点数字段: π值
//        HexDto piValue = new HexDto();
//        piValue.setName("piValue");
//        piValue.setStartPosition(0);
//        piValue.setLength(4);
//        piValue.setType("3"); // 小数（浮点数）
//        rules.add(piValue);
//
//        // 64位浮点数字段: 自然常数e
//        HexDto eValue = new HexDto();
//        eValue.setName("eValue");
//        eValue.setStartPosition(4);
//        eValue.setLength(8);
//        eValue.setType("3"); // 小数（浮点数）
//        rules.add(eValue);
//
//        // 32位浮点数字段: 千值
//        HexDto thousandValue = new HexDto();
//        thousandValue.setName("thousandValue");
//        thousandValue.setStartPosition(12);
//        thousandValue.setLength(4);
//        thousandValue.setType("3"); // 小数（浮点数）
//        rules.add(thousandValue);
//
//        Map<String, Object> result = parser.parseBytes(bytes, rules);
//        System.out.println("浮点数解析结果: " + result);
//
//        // 验证结果
//        if (result.get("piValue") instanceof Double) {
//            double pi = (Double) result.get("piValue");
//            System.out.println("π值: " + pi + " (期望接近3.14159)");
//        }
//
//        if (result.get("eValue") instanceof Double) {
//            double e = (Double) result.get("eValue");
//            System.out.println("e值: " + e + " (期望接近-2.718281828)");
//        }
//
//        if (result.get("thousandValue") instanceof Double) {
//            double thousand = (Double) result.get("thousandValue");
//            System.out.println("千值: " + thousand + " (期望接近1000.0)");
//        }
//    }
//
//    @Test
//    public void testHex() {
//
//        ByteStreamParser parser = new ByteStreamParser();
//        byte[] bytes = HexStringUtils.hexToBytes("41424344006400323FC0000000010014");
//        List<HexDto> hexDtos = new ArrayList<>();
//        initDto(hexDtos);
//        parser.parseBytes(bytes, hexDtos);
//
//    }
//
//    public void initDto(List<HexDto> rules){
//        // 设备ID
//        HexDto deviceId = new HexDto();
//        deviceId.setName("设备ID");
//        deviceId.setStartPosition(0);
//        deviceId.setLength(4);
//        deviceId.setType("1"); // 字符串
//        rules.add(deviceId);
//
//        // 温度
//        HexDto temperature = new HexDto();
//        temperature.setName("温度");
//        temperature.setStartPosition(4);
//        temperature.setLength(1);
//        temperature.setType("2");
//        temperature.setScale(10.0f); // 缩放因子
//        rules.add(temperature);
//
//        HexDto hight = new HexDto();
//        hight.setName("高度");
//        hight.setStartPosition(5);
//        hight.setLength(1);
//        hight.setType("2");
//        hight.setScale(10.0f); // 缩放因子
//        rules.add(hight);
//
//        // 湿度
//        HexDto humidity = new HexDto();
//        humidity.setName("湿度");
//        humidity.setStartPosition(6);
//        humidity.setLength(2);
//        humidity.setType("2"); // 整数
//        humidity.setScale(10.0f); // 缩放因子
//        rules.add(humidity);
//
//        // 压力
//        HexDto pressure = new HexDto();
//        pressure.setName("压力");
//        pressure.setStartPosition(8);
//        pressure.setLength(4);
//        pressure.setType("3"); // 小数
//        pressure.setScale(1.0f); // 缩放因子
//        rules.add(pressure);
//
//        // 状态码
//        HexDto statusCode = new HexDto();
//        statusCode.setName("状态码");
//        statusCode.setStartPosition(12);
//        statusCode.setLength(2);
//        statusCode.setType("4"); // 十六进制
//        rules.add(statusCode);
//
//        // 固件版本
//        HexDto firmwareVersion = new HexDto();
//        firmwareVersion.setName("固件版本");
//        firmwareVersion.setStartPosition(14);
//        firmwareVersion.setLength(2);
//        firmwareVersion.setType("2"); // 小数
//        firmwareVersion.setScale(100.0f); // 缩放因子
//        rules.add(firmwareVersion);
//    }
//
//
//    @Test
//    public void generateHexData() {
//        // 构造测试数据
//        byte[] data = new byte[16];
//
//        // 设备ID: "ABCD" (ASCII: 65 66 67 68)
//        data[0] = 'A';  // 0x41
//        data[1] = 'B';  // 0x42
//        data[2] = 'C';  // 0x43
//        data[3] = 'D';  // 0x44
//
//        // 温度: 25.0°C (值为250，缩放因子10)
//        data[4] = (byte) 20;  // 0xFA
//
//        // 更正：使用较小的值，如10.0m (值为100)
//        data[5] = -100; // 0x64
//
//        // 湿度: 60.0% (值为600，缩放因子10)
//        data[6] = (byte) (600 >> 8);  // 0x02
//        data[7] = (byte) (600 & 0xFF); // 0x58
//
//        // 压力: 1013.25 (值为1013.25，缩放因子1)
//        float pressure = -998.35f;
//        int pressureBits = Float.floatToIntBits(pressure);
//        data[8] = (byte) (pressureBits >> 24);   // 高字节
//        data[9] = (byte) (pressureBits >> 16);
//        data[10] = (byte) (pressureBits >> 8);
//        data[11] = (byte) (pressureBits & 0xFF); // 低字节
//
//
//        // 状态码: 0xABCD
//        data[12] = (byte) 0xAB;
//        data[13] = (byte) 0xCD;
//
//        // 固件版本: 2.1 (值为210，缩放因子100)
//        data[14] = (byte) (210 >> 8);  // 0x00
//        data[15] = (byte) (210 & 0xFF); // 0xD2
//
//        // 转换为十六进制字符串
//        StringBuilder hexString = new StringBuilder();
//        for (byte b : data) {
//            hexString.append(String.format("%02X", b & 0xFF));
//        }
//
//        System.out.println("生成的十六进制数据: " + hexString.toString());
//        // 预期输出: 41424344FA64025800018B45ABCD00D2
//
//        // 测试解析
//        ByteStreamParser parser = new ByteStreamParser();
//        List<HexDto> rules = new ArrayList<>();
//        initDto(rules);
//        JSONObject jsonObject = parser.parseBytes(data, rules);
//        System.out.println(jsonObject);
//    }
//}
